home *** CD-ROM | disk | FTP | other *** search
/ PC Format (PL) 2015 August / PC_Format_082015.iso / Pełne wersje / F-Secure FREEDOME VPN 1.0.11 / Freedome.exe / QtGraphicalEffects / private / GaussianDirectionalBlur.qml < prev    next >
Text File  |  2015-04-13  |  13KB  |  287 lines

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
  4. ** Contact: http://www.qt-project.org/legal
  5. **
  6. ** This file is part of the Qt Graphical Effects module.
  7. **
  8. ** $QT_BEGIN_LICENSE:BSD$
  9. ** You may use this file under the terms of the BSD license as follows:
  10. **
  11. ** "Redistribution and use in source and binary forms, with or without
  12. ** modification, are permitted provided that the following conditions are
  13. ** met:
  14. **   * Redistributions of source code must retain the above copyright
  15. **     notice, this list of conditions and the following disclaimer.
  16. **   * Redistributions in binary form must reproduce the above copyright
  17. **     notice, this list of conditions and the following disclaimer in
  18. **     the documentation and/or other materials provided with the
  19. **     distribution.
  20. **   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
  21. **     of its contributors may be used to endorse or promote products derived
  22. **     from this software without specific prior written permission.
  23. **
  24. **
  25. ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  26. ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  27. ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  28. ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  29. ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  30. ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  31. ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  32. ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  33. ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  34. ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  35. ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  36. **
  37. ** $QT_END_LICENSE$
  38. **
  39. ****************************************************************************/
  40.  
  41. import QtQuick 2.0
  42.  
  43. Item {
  44.     id: rootItem
  45.     property variant source
  46.     property real deviation: (radius + 1) / 3.3333
  47.     property real radius: 0.0
  48.     property int maximumRadius: 0
  49.     property real horizontalStep: 0.0
  50.     property real verticalStep: 0.0
  51.     property bool transparentBorder: false
  52.     property bool cached: false
  53.  
  54.     property bool enableColor: false
  55.     property color color: "white"
  56.     property real spread: 0.0
  57.  
  58.     property bool enableMask: false
  59.     property variant maskSource
  60.  
  61.     SourceProxy {
  62.         id: sourceProxy
  63.         input: rootItem.source
  64.     }
  65.  
  66.     SourceProxy {
  67.         id: maskSourceProxy
  68.         input: rootItem.maskSource
  69.     }
  70.  
  71.     ShaderEffectSource {
  72.         id: cacheItem
  73.         anchors.fill: rootItem
  74.         visible: rootItem.cached
  75.         smooth: true
  76.         sourceItem: shaderItem
  77.         live: true
  78.         hideSource: visible
  79.     }
  80.  
  81.     ShaderEffect {
  82.         id: shaderItem
  83.         property variant source: sourceProxy.output
  84.         property real deviation: Math.max(0.1, rootItem.deviation)
  85.         property real radius: rootItem.radius
  86.         property int maxRadius: rootItem.maximumRadius
  87.         property bool transparentBorder: rootItem.transparentBorder
  88.         property real gaussianSum: 0.0
  89.         property real startIndex: 0.0
  90.         property real deltaFactor: (2 * radius - 1) / (maxRadius * 2 - 1)
  91.         property real expandX: transparentBorder && rootItem.horizontalStep > 0 ? maxRadius / width : 0.0
  92.         property real expandY: transparentBorder && rootItem.verticalStep > 0 ? maxRadius / height : 0.0
  93.         property variant gwts: []
  94.         property variant delta: Qt.vector3d(rootItem.horizontalStep * deltaFactor, rootItem.verticalStep * deltaFactor, startIndex);
  95.         property variant factor_0_2: Qt.vector3d(gwts[0], gwts[1], gwts[2]);
  96.         property variant factor_3_5: Qt.vector3d(gwts[3], gwts[4], gwts[5]);
  97.         property variant factor_6_8: Qt.vector3d(gwts[6], gwts[7], gwts[8]);
  98.         property variant factor_9_11: Qt.vector3d(gwts[9], gwts[10], gwts[11]);
  99.         property variant factor_12_14: Qt.vector3d(gwts[12], gwts[13], gwts[14]);
  100.         property variant factor_15_17: Qt.vector3d(gwts[15], gwts[16], gwts[17]);
  101.         property variant factor_18_20: Qt.vector3d(gwts[18], gwts[19], gwts[20]);
  102.         property variant factor_21_23: Qt.vector3d(gwts[21], gwts[22], gwts[23]);
  103.         property variant factor_24_26: Qt.vector3d(gwts[24], gwts[25], gwts[26]);
  104.         property variant factor_27_29: Qt.vector3d(gwts[27], gwts[28], gwts[29]);
  105.         property variant factor_30_31: Qt.point(gwts[30], gwts[31]);
  106.  
  107.         property color color: rootItem.color
  108.         property real spread: 1.0 - (rootItem.spread * 0.98)
  109.         property variant maskSource: maskSourceProxy.output
  110.  
  111.         anchors.fill: rootItem
  112.  
  113.         function gausFunc(x){
  114.             //Gaussian function = h(x):=(1/sqrt(2*3.14159*(D^2))) * %e^(-(x^2)/(2*(D^2)));
  115.             return (1.0 / Math.sqrt(2 * Math.PI * (Math.pow(shaderItem.deviation, 2)))) * Math.pow(Math.E, -((Math.pow(x, 2)) / (2 * (Math.pow(shaderItem.deviation, 2)))));
  116.         }
  117.  
  118.         function updateGaussianWeights() {
  119.             gaussianSum = 0.0;
  120.             startIndex = -maxRadius + 0.5
  121.  
  122.             var n = new Array(32);
  123.             for (var j = 0; j < 32; j++)
  124.                 n[j] = 0;
  125.  
  126.             var max = maxRadius * 2
  127.             var delta = (2 * radius - 1) / (max - 1);
  128.             for (var i = 0; i < max; i++) {
  129.                 n[i] = gausFunc(-radius + 0.5 + i * delta);
  130.                 gaussianSum += n[i];
  131.             }
  132.  
  133.             gwts = n;
  134.         }
  135.  
  136.         function buildFragmentShader() {
  137.  
  138.         var shaderSteps = [
  139.             "gl_FragColor += texture2D(source, texCoord) * factor_0_2.x; texCoord += shift;",
  140.             "gl_FragColor += texture2D(source, texCoord) * factor_0_2.y; texCoord += shift;",
  141.             "gl_FragColor += texture2D(source, texCoord) * factor_0_2.z; texCoord += shift;",
  142.  
  143.             "gl_FragColor += texture2D(source, texCoord) * factor_3_5.x; texCoord += shift;",
  144.             "gl_FragColor += texture2D(source, texCoord) * factor_3_5.y; texCoord += shift;",
  145.             "gl_FragColor += texture2D(source, texCoord) * factor_3_5.z; texCoord += shift;",
  146.  
  147.             "gl_FragColor += texture2D(source, texCoord) * factor_6_8.x; texCoord += shift;",
  148.             "gl_FragColor += texture2D(source, texCoord) * factor_6_8.y; texCoord += shift;",
  149.             "gl_FragColor += texture2D(source, texCoord) * factor_6_8.z; texCoord += shift;",
  150.  
  151.             "gl_FragColor += texture2D(source, texCoord) * factor_9_11.x; texCoord += shift;",
  152.             "gl_FragColor += texture2D(source, texCoord) * factor_9_11.y; texCoord += shift;",
  153.             "gl_FragColor += texture2D(source, texCoord) * factor_9_11.z; texCoord += shift;",
  154.  
  155.             "gl_FragColor += texture2D(source, texCoord) * factor_12_14.x; texCoord += shift;",
  156.             "gl_FragColor += texture2D(source, texCoord) * factor_12_14.y; texCoord += shift;",
  157.             "gl_FragColor += texture2D(source, texCoord) * factor_12_14.z; texCoord += shift;",
  158.  
  159.             "gl_FragColor += texture2D(source, texCoord) * factor_15_17.x; texCoord += shift;",
  160.             "gl_FragColor += texture2D(source, texCoord) * factor_15_17.y; texCoord += shift;",
  161.             "gl_FragColor += texture2D(source, texCoord) * factor_15_17.z; texCoord += shift;",
  162.  
  163.             "gl_FragColor += texture2D(source, texCoord) * factor_18_20.x; texCoord += shift;",
  164.             "gl_FragColor += texture2D(source, texCoord) * factor_18_20.y; texCoord += shift;",
  165.             "gl_FragColor += texture2D(source, texCoord) * factor_18_20.z; texCoord += shift;",
  166.  
  167.             "gl_FragColor += texture2D(source, texCoord) * factor_21_23.x; texCoord += shift;",
  168.             "gl_FragColor += texture2D(source, texCoord) * factor_21_23.y; texCoord += shift;",
  169.             "gl_FragColor += texture2D(source, texCoord) * factor_21_23.z; texCoord += shift;",
  170.  
  171.             "gl_FragColor += texture2D(source, texCoord) * factor_24_26.x; texCoord += shift;",
  172.             "gl_FragColor += texture2D(source, texCoord) * factor_24_26.y; texCoord += shift;",
  173.             "gl_FragColor += texture2D(source, texCoord) * factor_24_26.z; texCoord += shift;",
  174.  
  175.             "gl_FragColor += texture2D(source, texCoord) * factor_27_29.x; texCoord += shift;",
  176.             "gl_FragColor += texture2D(source, texCoord) * factor_27_29.y; texCoord += shift;",
  177.             "gl_FragColor += texture2D(source, texCoord) * factor_27_29.z; texCoord += shift;",
  178.  
  179.             "gl_FragColor += texture2D(source, texCoord) * factor_30_31.x; texCoord += shift;",
  180.             "gl_FragColor += texture2D(source, texCoord) * factor_30_31.y; texCoord += shift;"
  181.         ]
  182.  
  183.             var shader = fragmentShaderBegin
  184.             var samples = maxRadius * 2
  185.             if (samples > 32) {
  186.                 console.log("DirectionalGaussianBlur.qml WARNING: Maximum of blur radius (16) exceeded!")
  187.                 samples = 32
  188.             }
  189.  
  190.             for (var i = 0; i < samples; i++) {
  191.                 shader += shaderSteps[i]
  192.             }
  193.  
  194.             shader += fragmentShaderEnd
  195.  
  196.             var colorizeSteps = ""
  197.             var colorizeUniforms = ""
  198.  
  199.             var maskSteps = ""
  200.             var maskUniforms = ""
  201.  
  202.             if (enableColor) {
  203.                 colorizeSteps += "gl_FragColor = mix(vec4(0), color, clamp((gl_FragColor.a - 0.0) / (spread - 0.0), 0.0, 1.0));\n"
  204.                 colorizeUniforms += "uniform highp vec4 color;\n"
  205.                 colorizeUniforms += "uniform highp float spread;\n"
  206.             }
  207.  
  208.             if (enableMask) {
  209.                 maskSteps += "shift *= texture2D(maskSource, qt_TexCoord0).a;\n"
  210.                 maskUniforms += "uniform sampler2D maskSource;\n"
  211.             }
  212.  
  213.             shader = shader.replace("PLACEHOLDER_COLORIZE_STEPS", colorizeSteps)
  214.             shader = shader.replace("PLACEHOLDER_COLORIZE_UNIFORMS", colorizeUniforms)
  215.             shader = shader.replace("PLACEHOLDER_MASK_STEPS", maskSteps)
  216.             shader = shader.replace("PLACEHOLDER_MASK_UNIFORMS", maskUniforms)
  217.  
  218.             fragmentShader = shader
  219.         }
  220.  
  221.         onDeviationChanged: updateGaussianWeights()
  222.  
  223.         onRadiusChanged: updateGaussianWeights()
  224.  
  225.         onTransparentBorderChanged: {
  226.             buildFragmentShader()
  227.             updateGaussianWeights()
  228.         }
  229.  
  230.         onMaxRadiusChanged: {
  231.             buildFragmentShader()
  232.             updateGaussianWeights()
  233.         }
  234.  
  235.         Component.onCompleted: {
  236.             buildFragmentShader()
  237.             updateGaussianWeights()
  238.         }
  239.  
  240.         property string fragmentShaderBegin: "
  241.             varying mediump vec2 qt_TexCoord0;
  242.             uniform highp float qt_Opacity;
  243.             uniform lowp sampler2D source;
  244.             uniform highp vec3 delta;
  245.             uniform highp vec3 factor_0_2;
  246.             uniform highp vec3 factor_3_5;
  247.             uniform highp vec3 factor_6_8;
  248.             uniform highp vec3 factor_9_11;
  249.             uniform highp vec3 factor_12_14;
  250.             uniform highp vec3 factor_15_17;
  251.             uniform highp vec3 factor_18_20;
  252.             uniform highp vec3 factor_21_23;
  253.             uniform highp vec3 factor_24_26;
  254.             uniform highp vec3 factor_27_29;
  255.             uniform highp vec3 factor_30_31;
  256.             uniform highp float gaussianSum;
  257.             uniform highp float expandX;
  258.             uniform highp float expandY;
  259.             PLACEHOLDER_MASK_UNIFORMS
  260.             PLACEHOLDER_COLORIZE_UNIFORMS
  261.  
  262.             void main() {
  263.                 highp vec2 shift = vec2(delta.x, delta.y);
  264.  
  265.                 PLACEHOLDER_MASK_STEPS
  266.  
  267.                 highp float index = delta.z;
  268.                 mediump vec2 texCoord = qt_TexCoord0;
  269.                 texCoord.s = (texCoord.s - expandX) / (1.0 - 2.0 * expandX);
  270.                 texCoord.t = (texCoord.t - expandY) / (1.0 - 2.0 * expandY);
  271.                 texCoord +=  (shift * index);
  272.  
  273.                 gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
  274.         "
  275.  
  276.         property string fragmentShaderEnd: "
  277.  
  278.                 gl_FragColor /= gaussianSum;
  279.  
  280.                 PLACEHOLDER_COLORIZE_STEPS
  281.  
  282.                 gl_FragColor *= qt_Opacity;
  283.             }
  284.         "
  285.      }
  286. }
  287.